TypeScript で 数当てゲーム に挑む #TypeScript #CLI
TypeScript で 数当てゲーム に挑む
TypeScript で 数当てゲーム に挑む
数当てゲーム とは
プログラミング学習でよく見る 入門用プログラムです
- ランダムに決められた数を当てる
- ハズレの入力の場合は、ヒントを出す
- 当たれば終了
TypeScript で 数当てゲーム コードを書いてみます
- 標準のライブラリで実装
- Promise で入力値を待つ
import readline, { ReadLine } from "readline"; type Input = any; type Ans = number; type InputValidate = (p: Input, ans: Ans) => string; type IsMatch = (p: Input, ans: Ans) => boolean; // 定型文 const msg = "0-100で数字を当てて\n"; // 0 ~ 100 const createAnser = () => Math.floor(Math.random() * (100 - 0) + 0); // 対話形式の準備, 答えの生成 const init = (ansCreater: () => number) => ({ rl: readline.createInterface({ input: process.stdin, output: process.stdout }), ans: ansCreater() }); // 入力値の取得 const readUserInput = (rl: ReadLine, question: string) => new Promise(resolve => rl.question(question, answer => resolve(answer))); // 入力値に対して の処理 const inputResponse = async (rl: ReadLine, msg: string): Promise<Input> => await readUserInput(rl, msg); // 答え合わせ const isMatch: IsMatch = (input: Input, ans: Ans) => input === ans; // 入力値に対してのレスポンス const inputValidate: InputValidate = (input, ans) => { if (isNaN(input)) { return "まじめに..."; } if (input < ans) { return "もっと上"; } if (input > ans) { return "もっと下"; } return "あたり"; }; // 出力 これを console.log を ラップしておくと後々 テストしやすいので おすすめ const put = (p: string, f = console.log) => f(p); // 実処理 const game = async (rl: ReadLine, ans: Ans) => { // 入力 -> Enter をプロミスで待ちつつ await new Promise(async resolve => { // 入力値受け取り const input = parseInt(await inputResponse(rl, msg)); put(inputValidate(input, ans)); if (!isMatch(input, ans)) { // 再帰 while で待たない await game(rl, ans); } // おしまい resolve(); }); }; // エントリーポイント const main = async () => { const { rl, ans } = init(createAnser); console.log(`答え: ${ans}`); await game(rl, ans); rl.close(); }; main();
TypeScript で 数当てゲーム コードを動かしてみる
まとめ
対話形式は、ライブラリを使った方が簡単ですが
一度自分で作って 雰囲気を掴むのはいいかもしれません